; Программа для вычисления квадратного корня
; по формуле Герона
; ---------------------
; Автор: Филонов Павел (filonovpv@gmail.com)
; 2 мая 2011 г.

; Основная функция
(define (sqrt a)
  (sqrt-iter a 1.0)) ; 1.0 - начальное приближение

; Основная идея метода последовательных приближений
(define (sqrt-iter a guess)  ; guess - приближённое решение
  (if (good-enough? guess a) ; если guess - удачное приближение,
      guess                  ; то guess - ответ.
      (sqrt-iter a (improve guess a)))) ; Иначе, улучшить приближение

; Функция проверяет достаточно ли мы близко подошли к ответу
(define (good-enough? guess a)
  (< (abs (- a (sqr guess))) eps)) ;|a - guess^2| < eps

; точность
(define eps 0.0000001)

; Улучшаем приближение по формуле Герона
(define (improve guess a)
  (avg guess (/ a guess))) ; guess = 1/2*(guess + a/guess)

; Среднее арифметическое
(define (avg x y)
  (/ (+ x y) 2))

; Квадрат числа
(define (sqr x)
  (* x x))
